"""GLUT replacement for the original checker.py demonstration code

Note:
	Has no navigation code ATM.
"""

# This is statement is required by the build system to query build info
if __name__ == '__build__':
    raise Exception

__version__ = '$Revision: 1.1.1.1 $'[11:-2]
__date__ = '$Date: 2007/02/15 19:25:11 $'[6:-2]

import OpenGL

OpenGL.ERROR_ON_COPY = True

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import time, sys

try:
    from numpy import *
except ImportError(err):
    try:
        from Numeric import *
    except ImportError(err):
        print("This demo requires the numpy or Numeric extension, sorry")
        import sys

        sys.exit()


def drawCheckerBoard(N=5, white=GLfloat_3(1, 1, 1), black=GLfloat_3(0, 0, 0)):
    """Draw an 2N*2N checkerboard with given colours"""
    glDisable(GL_LIGHTING)
    try:
        for x in range(-N, N):
            for y in range(-N, N):
                if (x + y) % 2 == 0:
                    glColor3fv(white)
                else:
                    glColor3fv(black)
                glRectf(x, y, x + 1, y + 1)
    finally:
        glEnable(GL_LIGHTING)


def drawSphere(center=(0, 0, 1), radius=1.0, sides=20):
    glPushMatrix()
    try:
        glTranslatef(*center)
        glutSolidSphere(radius, sides, sides)
    finally:
        glPopMatrix()


def display(swap=1, clear=1):
    """Callback function for displaying the scene

    This defines a unit-square environment in which to draw,
    i.e. width is one drawing unit, as is height
    """
    if clear:
        glClearColor(0.5, 0.5, 0.5, 0)
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # establish the projection matrix (perspective)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    x, y, width, height = glGetDoublev(GL_VIEWPORT)
    gluPerspective(45,  # field of view in degrees
                   width / float(height or 1),  # aspect ratio
                   .25,  # near clipping plane
                   200,  # far clipping plane
                   )

    # and then the model view matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0, 1, 20,  # eyepoint
              0, 0, 0,  # center-of-view
              0, 1, 0,  # up-vector
              )
    glLightfv(GL_LIGHT0, GL_DIFFUSE, GLfloat_3(.8, .8, .3))
    glLightfv(GL_LIGHT0, GL_POSITION, GLfloat_4(1, 1, 3, 0))
    glEnable(GL_LIGHT0)

    rotation()
    drawCheckerBoard()
    drawSphere()
    if swap:
        glutSwapBuffers()


def idle():
    glutPostRedisplay()


starttime = time.time()


def rotation(period=10):
    """Do rotation of the scene at given rate"""
    angle = (((time.time() - starttime) % period) / period) * 360
    glRotate(angle, 0, 1, 0)
    return angle


def key_pressed(*args):
    # If escape is pressed, kill everything.
    if args[0] == '\033':
        sys.exit()


if __name__ == "__main__":
    print("""You should see a sphere+checker-board rotating about the origin.""")
    import sys

    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
    glutCreateWindow('Rotating Checkerboard')
    glutDisplayFunc(display)
    glutKeyboardFunc(key_pressed)
    glutIdleFunc(display)
    # note need to do this to properly render faceted geometry
    glEnable(GL_DEPTH_TEST)
    glutMainLoop()
